-- this will enable following commands
-- 1. npm 2. yarn 3. npx 4. node 5. npx 6. pnpm

local cmds = {
  'Npm',
  'Yarn',
  'Npx',
  'Node',
  'Pnpm',
}

local cmd_complete = function(arglead, cmdline, cursorpos)
  local npm = {
    'install',
    'uninstall',
    'run',
    'init',
    'update',
    'outdated',
    'audit',
    'list',
    'ls',
    'search',
    'access',
    'adduser',
    'login',
    'logout',
    'publish',
    'version',
    'tag',
    'deprecate',
    'owner',
    'team',
    'whoami',
    'config',
    'help',
    'start',
    'stop',
    'restart',
    'test',
    'cache',
    'root',
    'bin',
    'dedupe',
    'exec',
    'explore',
    'link',
    'unlink',
    'pack',
    'prune',
    'rebuild',
    'repo',
    'shrinkwrap',
    'unpublish',
    'update',
    'upgrade',
    'ci',
    'create',
  }
  local yarn = {
    'install',
    'add',
    'upgrade',
    'remove',
    'run',
    'init',
    'info',
    'help',
    'bin',
    'list',
    'outdated',
    'audit',
    'login',
    'logout',
    'publish',
    'owner',
    'access',
    'team',
    'tag',
    'version',
    'cache',
    'config',
    'dedupe',
    'exec',
    'global',
    'link',
    'unlink',
    'pack',
    'rebuild',
    'install-ci-test',
    'upgrade-interactive',
    'why',
    'workspace',
    'workspaces',
  }
  local npx = {
    'install',
    'add',
    'remove',
    'run',
    'init',
    'info',
    'help',
    'bin',
    'list',
    'outdated',
    'audit',
    'login',
    'logout',
    'publish',
    'owner',
    'access',
    'team',
    'tag',
    'version',
    'cache',
    'config',
    'dedupe',
    'exec',
    'global',
    'link',
    'unlink',
    'pack',
    'rebuild',
    'install-ci-test',
    'upgrade-interactive',
    'why',
    'workspace',
    'workspaces',
  }
  local node = {
    '-v',
    '--version',
    '-h',
    '--help',
    '-e',
    '--eval',
    '-p',
    '--print',
    '-c',
    '--check',
    '-i',
    '--interactive',
    '-r',
    '--require',
    '-m',
    '--module',
    '-p',
    '--preserve-symlinks',
    '-r',
    '--require',
    '-t',
    '--trace-warnings',
    '-w',
    '--warnings',
    '-c',
    '--no-warnings',
    '-r',
    '--experimental-repl-await',
    '-i',
    '--input',
    '-o',
    '--output',
    '-s',
    '--shell',
    '-r',
    '--repl',
    '-m',
    '--experimental-modules',
    '-n',
    '--no-warnings',
    '-v',
    '--version',
    '-h',
    '--help',
    '-e',
    '--eval',
    '-p',
    '--print',
    '-c',
    '--check',
    '-i',
    '--interactive',
    '-r',
    '--require',
    '-m',
    '--module',
    '-p',
    '--preserve-symlinks',
    '-r',
    '--require',
    '-t',
    '--trace-warnings',
    '-w',
    '--warnings',
    '-c',
    '--no-warnings',
    '-r',
    '--experimental-repl-await',
    '-i',
    '--input',
    '-o',
    '--output',
    '-s',
    '--shell',
    '-r',
    '--repl',
    '-m',
    '--experimental-modules',
    '-n',
    '--no-warnings',
  }
  local pnpm = {
    'install',
    'add',
    'remove',
    'run',
    'init',
    'info',
    'help',
    'bin',
    'list',
    'outdated',
    'audit',
    'login',
    'logout',
    'publish',
    'owner',
    'access',
    'team',
    'tag',
    'version',
    'cache',
    'config',
    'dedupe',
    'exec',
    'global',
    'link',
    'unlink',
    'pack',
    'rebuild',
    'install-ci-test',
    'upgrade-interactive',
    'why',
    'workspace',
    'workspaces',
  }
  return npm
end

local on_output = require('web-tools.loop').on_output
local proccess_output = require('web-tools.loop').proccess_output
local on_exit = require('web-tools.loop').on_exit

local util = require('web-tools.utils')
local log = util.log
local function request(cmd, callback)
  response = {}
  tmpfile = vim.fn.tempname()
  log(cmd)

  require('web-tools.loop').new_job(cmd, {})
end

local function setup()
  for _, cmd in ipairs(cmds) do
    vim.api.nvim_create_user_command(cmd, function(args)
      cmd = string.lower(cmd)
      local fargs = args.fargs and table.concat(args.fargs, ' ') or ''
      cmd = string.format('%s %s', cmd, fargs)
      request(cmd)
    end, { nargs = '*', complete = require('web-tools.commands').cmd_complete })
  end
end

return {
  setup = setup,
  cmd_complete = cmd_complete,
}
